/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package myftp.core.explorer;

import myftp.app.model.ExplorerModel;
import myftp.app.model.ExplorerTreeModel;
import java.io.*;
import java.util.*;
import myftp.app.model.ExplorerTableModel;
import myftp.app.model.ServerModel;
import myftp.app.model.FileModel;
import myftp.app.view.ServerTabPartView;
import myftp.app.view.listener.ServerActionListener;
import myftp.core.server.ServerFile;
import myftp.core.view.listener.HeaderListener;

/**
 *
 * @author CAVARLE Glenn, LUCAS Stéphane
 *Explorateur de fichiers DISTANTS
 */
public class FtpExplorer extends ExplorerModel {

    HashMap<String, ArrayList> subAll = new HashMap<String, ArrayList>();

    /**
     * Constructeur FtpExplorer
     * @param server
     * @param tab
     */
    public FtpExplorer(ServerModel server, ServerTabPartView tab) {
        super(server, tab, server.getCurrentDir());
        this.fileTable.addMouseListener(new ServerActionListener(this, tab));
    }

    /**
     * Exploration d'un dossier
     * @param node
     */
    protected void exploreNode(ExplorerTreeModel node) {

        ExplorerTreeModel[] fils = getReps(node);
        for (int i = 0; i < fils.length; i++) {
            node.add(fils[i]);
        }

        node.haveBeenExplored();
    }

    /**
     * Listage des répertoires présents
     * @param rep
     */
    protected ExplorerTreeModel[] getReps(ExplorerTreeModel rep) {

        ExplorerTreeModel[] subDirs = new ExplorerTreeModel[0];
        String newPath = rep.getPathNode();

        try {
            if (!this.server.changeDirectory(newPath)) {
                throw new IOException("change directory error for:" + newPath);
            }
            this.currentServerDir = newPath;

            /* Demande au serveur de la liste de répertoires */
            if ((this.subAll = this.server.listSubDirs()) == null) {
                throw new IOException("listSubDirs error");
            }
            ArrayList<ServerFile> dirList = this.subAll.get("directory");
            try {
                subDirs = new ExplorerTreeModel[dirList.size()];
            } catch (NegativeArraySizeException negSizeExp) {
                System.out.println("Erreur de dossier" + negSizeExp.getLocalizedMessage());
            }

            for (int i = 0; i < dirList.size(); i++) {
                subDirs[i] = (new ExplorerTreeModel(newPath + "/" + dirList.get(i).getName()));
            }

        } catch (IOException e) {
            System.out.println("getReps Error:" + e.getLocalizedMessage());
        }
        return subDirs;
    }

    /**
     *  Rafraichissement de la liste des fichiers
     * @param node
     */
    public void refreshFileTab(ExplorerTreeModel node) {

        String newPath = node.getPathNode();

        try {
            if (!this.server.changeDirectory(newPath)) {
                throw new IOException("change directory error for:" + newPath);
            }
            this.currentServerDir = newPath;

            if ((this.subAll = this.server.listSubDirs()) == null) {
                throw new IOException("listSubDirs error");

            }
            /* Listage des fichiers présents */
            ArrayList<ServerFile> fileList = this.subAll.get("file");

            Collection tableOfFile = new ArrayList();

            for (int i = 0; i < fileList.size(); i++) {
                ServerFile file = fileList.get(i);

                /* Ajout du fichier dans le tableau */
                if (!file.getRight().startsWith("-")) {
                    tableOfFile.add(new FileModel(
                            file.getName(),
                            file.getSizeString(),
                            file.getDatetime()));
                }
            }


            /* Remplacement du tableau de fichiers par le nouveau */
            ExplorerTableModel fileTab = new ExplorerTableModel(tableOfFile);
            this.fileTable.setModel(fileTab);

            /* Ajout du HeaderListener pour le tri par colonne */
            fileTable.getTableHeader().addMouseListener(new HeaderListener(this.fileTable.getTableHeader()));
            /* Ajout du comparateur pour le tri */
            fileTab.setComparator(new FileComparator());

        } catch (IOException e) {
            System.out.println("refreshFileTab Error:" + e.getLocalizedMessage());

        }
    }
}
